package com.fh.reflection;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;

/**
 * @author 方小勤
 * @version 1.0~
 */
public class Reflection01 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        //1. 使用 Properties 类，可以读写配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        //2. 使用反射机制解决
        //1) 加载类，返回 Class 类型的对象cls
        Class<?> cls = Class.forName(classfullpath);
        //2) 通过 cls 得到你加载的类 com.fh.Cat 的对象实例
        Object o = cls.getDeclaredConstructor().newInstance();
        System.out.println("o的运行类型 = "+o.getClass());
        //3) 得到方法
        cls.getMethod(methodName).invoke(o);


        //java.lang.reflect.Field：代表类的成员变量，Field对象表示某个类的成员变量
        //得到 name 字段，getField不能得到私有的属性
        Field ageFiled = cls.getField("age");
        System.out.println(ageFiled.get(o));
        //java.lang.reflect.Constructor：代表类的构造方法,Constructor 对象表示构造器
        Constructor<?> constructor = cls.getConstructor();//()中可以指定狗在其参数类型，没有则返回无参构造器
        System.out.println(constructor);
        Constructor<?> constructor2 = cls.getConstructor(String.class);//()中可以指定狗在其参数类型，没有则返回无参构造器
        System.out.println(constructor2);
    }
}
